------------------------------------------------------------------------------- -- Project : stoch_add -- File : pkg_add.vhdl -- Desc : Package for parallel prefix operation ------------------------------------------------------------------------------- -- Authors : Alberto Garcia-Ortiz -- Ardalan Najafi -- Company : ITEM -- Created : 2016-08-09 -- Last update : 2016-09-28 ------------------------------------------------------------------------------- -- Copyright (c) 2016 ------------------------------------------------------------------------------- -- Revisions : -- Date Version Author Description -- 2016-08-09 1.0 agarcia Created ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; package pkg_add is type pg_t is record p : std_logic; g : std_logic; end record; type pg_vec is array (integer range <>) of pg_t; type blk_def_t is array (natural range <>) of natural; function get_rg_m (constant ks : blk_def_t; constant lev : natural) return natural; function get_rg_l (constant ks : blk_def_t; constant lev : natural) return natural; function log2ceil (n : integer) return integer; function log2floor (n : integer) return integer; end pkg_add; package body pkg_add is function get_rg_m (constant ks : blk_def_t; constant lev : natural) return natural is variable aux : natural; begin aux := 0; for ki in 0 to lev loop aux := aux + ks(ki); end loop; -- ki return aux-1; end get_rg_m; function get_rg_l (constant ks : blk_def_t; constant lev : natural) return natural is variable aux : natural; begin aux := 0; for ki in 0 to (lev-1) loop aux := aux + ks(ki); end loop; -- ki return aux; end get_rg_l; -- purpose: computes ceil(log2(n)) function log2ceil (n : integer) return integer is variable m, p : integer; begin m := 0; p := 1; for i in 0 to n loop if p < n then m := m + 1; p := p * 2; end if; end loop; return m; end log2ceil; -- purpose: computes floor(log2(n)) function log2floor (n : integer) return integer is variable m, p : integer; begin m := -1; p := 1; for i in 0 to n loop if p <= n then m := m + 1; p := p * 2; end if; end loop; return m; end log2floor; end pkg_add;